package pe.com.bbva.efcap.servidor.servicio.impl;

import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.com.bbva.efcap.servidor.bean.IndicadorBean;
import pe.com.bbva.efcap.servidor.bean.PeriodoCuentaBean;
import pe.com.bbva.efcap.servidor.bean.ValoresBean;
import pe.com.bbva.efcap.servidor.bean.rating.PeriodoBean;
import pe.com.bbva.efcap.servidor.dao.DetalleSimulacionDAO;
import pe.com.bbva.efcap.servidor.modelo.entidad.DetalleSimulacion;
import pe.com.bbva.efcap.servidor.modelo.entidad.Indicador;
import pe.com.bbva.efcap.servidor.modelo.entidad.ParametroGeneral;
import pe.com.bbva.efcap.servidor.servicio.DetSimulacService;
import pe.com.bbva.efcap.servidor.servicio.DetalleSimulacionService;


@Service
@Transactional(readOnly = true)
public class DetalleSimulacionServiceImpl implements DetalleSimulacionService, Serializable {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(ClienteServiceImpl.class);
	
	@Autowired
	private DetalleSimulacionDAO detSimDao;

	@Override
	public List<PeriodoCuentaBean> getPeriodoCuentas(int codSimulacion,
			String catalogo, String tipoDependencia) {
		try {
			List<DetalleSimulacion> detalleSimulacionList = new ArrayList<DetalleSimulacion>();

			detalleSimulacionList = detSimDao.getSimulacionPeriodo(codSimulacion, catalogo, tipoDependencia);

			List<PeriodoCuentaBean> periodoCuentaListBean = new ArrayList<PeriodoCuentaBean>();
			PeriodoCuentaBean per = null;
			List<ValoresBean> var = null;
			
			for (DetalleSimulacion d : detalleSimulacionList){
				ValoresBean val = new ValoresBean();
				val.setValor(Double.parseDouble(d.getValor()));
				val.setTipoDependencia(d.getTipoDependencia().intValueExact());
				if (per == null){
					per = new PeriodoCuentaBean();
					per.setPeriodo(d.getPeriodo());	
					var = new ArrayList<ValoresBean>();
					var.add(val);
				}else{
					if(per.getPeriodo().equals(d.getPeriodo())){
						var.add(val);						
					}else{
						per.setIndicadores(var);
						periodoCuentaListBean.add(per);
						per = new PeriodoCuentaBean();
						per.setPeriodo(d.getPeriodo());	
						var = new ArrayList<ValoresBean>();
						var.add(val);
					}
				}
			}
			if(per != null){   
				per.setIndicadores(var);
				periodoCuentaListBean.add(per);
			}
			
			return periodoCuentaListBean;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	
	@Override
	public List<PeriodoCuentaBean> getSimulacionProyeccion(int codSimulacion,
			String catalogo) {
		try {
			List<DetalleSimulacion> detalleSimulacionList = detSimDao.getSimulacionProyeccion(codSimulacion, catalogo);

			List<PeriodoCuentaBean> periodoCuentaListBean = new ArrayList<PeriodoCuentaBean>();
			PeriodoCuentaBean per = null;
			List<ValoresBean> lValoresBean = null;
			for (DetalleSimulacion d : detalleSimulacionList){
				ValoresBean val = new ValoresBean();
				val.setValor(Double.parseDouble(d.getValor()));
				val.setEditable(d.getIndicador().getEditable().intValue());
				val.setTipoDependencia(d.getTipoDependencia().intValue());
				val.setCodigo(Integer.parseInt(d.getIndicador().getCodigo()));
				if (per == null){
					per = new PeriodoCuentaBean();
					per.setPeriodo(d.getPeriodo());	
					lValoresBean = new ArrayList<ValoresBean>();
					lValoresBean.add(val);
				}else{
					if(per.getPeriodo().equals(d.getPeriodo())){
						lValoresBean.add(val);						
					}else{
						per.setIndicadores(lValoresBean);
						periodoCuentaListBean.add(per);
						per = new PeriodoCuentaBean();
						per.setPeriodo(d.getPeriodo());	
						lValoresBean = new ArrayList<ValoresBean>();
						lValoresBean.add(val);
					}
				}
			}
			if(per != null){
				per.setIndicadores(lValoresBean);
				periodoCuentaListBean.add(per);
			}			
			return periodoCuentaListBean;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.getMessage();
			return null;
		}
	}

	@Override
	public List<DetalleSimulacion> getDetalleSimulacion(int codSimulacion, int codIndicador, int tipDependencia) {
		try {
			return detSimDao.getDetalleSimulacion(codSimulacion, codIndicador, tipDependencia);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	
	@Override
	public List<ValoresBean> buscarNumeroPeriodos(String codigoSimulacion){
		try {
			List<String> detalleSimulacionList = detSimDao.getNumeroPeriodo(codigoSimulacion);
			List<ValoresBean> lista = new ArrayList<ValoresBean>();
			for (int i = 0; i < detalleSimulacionList.size(); i++) {
					ValoresBean bean = new ValoresBean();
					bean.setCodigo(i);
					bean.setDescripcion( detalleSimulacionList.get(i));
					lista.add(bean);
		        }
			return lista;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.getMessage();
			return null;
		}
	}

	@Override
	@Transactional(readOnly = false)
	public long guardarDetalleSimulacion(DetalleSimulacion detalleSim) {
		detSimDao.guardar(detalleSim);
		return 0;
	}

	@Override
	public Indicador obtenerIndicadorPorCodigo(String codigo, String idSimulacion) {
		try {
			return detSimDao.obtenerIndicadorPorCodigo(codigo, idSimulacion);
		} catch (Exception e) {
			LOGGER.error("IndicadorServiceImpl -> obtenerIndicadorPorCodigo: " + e.getMessage(), e);
			return null;
		}
	}
	
}
